home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 3 / CD ACTUAL 3.iso / linux / docs / linux-do / programm / lpg-0.4 / lpg-0 / LPG / examples / ipc / semstat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-01  |  1.8 KB  |  80 lines

  1. /*****************************************************************************
  2.  Excerpt from "Linux Programmer's Guide - Chapter 6"
  3.  (C)opyright 1994-1995, Scott Burkett
  4.  ***************************************************************************** 
  5.  MODULE: semstat.c
  6.  *****************************************************************************
  7.  A companion command line tool for the semtool package.  semstat displays
  8.  the current value of all semaphores in the set created by semtool.
  9.  *****************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <sys/types.h>
  14. #include <sys/ipc.h>
  15. #include <sys/sem.h>
  16.  
  17. int get_sem_count(int sid);
  18. void show_sem_usage(int sid);
  19. int get_sem_count(int sid);
  20. void dispval(int sid);
  21.  
  22. int main(int argc, char *argv[])
  23. {
  24.     key_t key;
  25.     int   semset_id;
  26.  
  27.     /* Create unique key via call to ftok() */
  28.     key = ftok(".", 's');
  29.  
  30.     /* Open the semaphore set - do not create! */
  31.     if((semset_id = semget(key, 1, 0666)) == -1) 
  32.     {
  33.         printf("Semaphore set does not exist\n");
  34.         exit(1);
  35.     }
  36.  
  37.     show_sem_usage(semset_id); 
  38.     return(0);
  39. }
  40.  
  41. void show_sem_usage(int sid)
  42. {
  43.     int cntr=0, maxsems, semval;
  44.  
  45.     maxsems = get_sem_count(sid);
  46.  
  47.     while(cntr < maxsems) {
  48.         semval = semctl(sid, cntr, GETVAL, 0);
  49.         printf("Semaphore #%d:  --> %d\n", cntr, semval);
  50.         cntr++;
  51.     }
  52. }
  53.  
  54. int get_sem_count(int sid)
  55. {
  56.     int rc;
  57.     struct semid_ds mysemds;
  58.     union semun semopts;
  59.  
  60.     /* Get current values for internal data structure */
  61.     semopts.buf = &mysemds;
  62.  
  63.     if((rc = semctl(sid, 0, IPC_STAT, semopts)) == -1) {
  64.         perror("semctl");
  65.         exit(1);
  66.     }
  67.  
  68.     /* return number of semaphores in set */
  69.     return(semopts.buf->sem_nsems);
  70. }
  71.  
  72. void dispval(int sid)
  73. {
  74.     int semval;
  75.  
  76.     semval = semctl(sid, 0, GETVAL, 0);
  77.     printf("semval is %d\n", semval);
  78. }
  79.  
  80.